<?php
/*
 * Класс для вывода страниц
 */
class dof_modlib_widgets_pages_navigation
{
    var $dof;
    var $code;      // код плагина
    var $count;     // количество записей
    var $limitnum;  // максимальное кол-во записей, отображенное на странице
    var $limitfrom; // номер записи, с которой начинается просмотр
    
    /** Конструктор класса. Осуществляет все проверки.
     * 
     * @param dof_control - глобальный объект $DOF 
     * @param string $code - код плагина
     * @param int $count - количество записей
     * @param int $limitnum - по сколько записей на странице выводить
     * @param int $limitfrom - начиная с какой записи выводить
     */
    function __construct(dof_control $dof, $code, $count, $limitfrom, $limitnum=NULL)
    {
        $this->dof = $dof;
        $this->code = $code;
        $this->count = $count;
        if ( is_int($limitfrom) AND ($limitfrom > 0) )
        {// если limitfrom положительное число
            // сохраняем его
            $this->limitfrom = $limitfrom;
        }else
        {// в остальных случаях отображаем список с первой записи
            $this->limitfrom = 1;
        }
        if ( is_int($limitnum) AND ($limitnum > 0) )
        {// если limitnum положительное число
            // сохраняем его
            $this->limitnum = $limitnum;
        }elseif( is_null($limitnum) )
        {// если limitnum не указан
            $this->limitnum = $this->dof->modlib('widgets')->get_limitnum_bydefault();
        }else
        {// если их там нет 
            // будем выводить на странице 10 наименований
            $this->limitnum = 10;
        }
    }
    
    /** Возвращает html-строку навигации,
     * разбивая ленту таблицы или списка на страницы.
     * Нумерация страница всегда начинается с единицы
     * 
     * @param string $adds - список дополнительных параметров для ссылки в виде строки
     * @param array $vars - список дополнительных параметров для ссылки 
     * @return string строка url-адреса с полным списком ссылок 
     * на все перечисляемые страницы
     */
    public function get_navpages_list($adds=null, $vars=array())
    {
        $result = '';
        if ( ! $this->count OR ($this->count <= $this->limitnum) )
        {// Если нет записей для отображения, или
            // весь список умещается на одной странице
            // значит выводим сразу всю таблицу,
            // и строка со ссылками на страницы не нужна
            return $result;
        }
        // вычислим общее количество страниц
        $totalpages = $this->get_total_pages($this->count);
        // создим ссылки на все страницы с самого начала 
        $limitfrom = 1;
        // для каждой страницы создадим ссылку
        for ($pagenum=1; $pagenum<=$totalpages; $pagenum++)
        {
            $result .= $this->get_page_link($pagenum, $limitfrom, $adds, $vars);
            $limitfrom = $limitfrom + $this->get_current_limitnum(); 
        }
        // вернем результат
        return '<div style="text-align:center;">'.$result.'</div>';
    }
    
    /** Возвращает ссылку на страницу или 
     * страницу без ссылки, если она является текущей
     * 
     * @param int $pagenum - номер страницы
     * @param int $limitfrom - номер записи, с которой начинается просмотр
     * @param string $adds - список дополнительных параметров для ссылки в виде строки
     * @param array $vars - список дополнительных параметров для ссылки 
     * @return string строка url-адреса со всеми параметрами 
     */
    private function get_page_link($pagenum, $limitfrom, $adds, $vars)
    {
        $result = '';
        // узнаем номер текущей страницы
        $thispagenum = $this->get_current_page();
        if ( $thispagenum == $pagenum )
        {// если это та страница, на которой мы сейсас находимся - то выводим ее как текст
            $result .= '<b>'.$pagenum.'</b> &nbsp;';
        }else
        {// во всех остальных случаях выводим ее как ссылку
            // добавляем номер страницы к параметрам ссылки
            $vars['limitfrom'] =  $limitfrom;
            $result .= '<a href="'.$this->dof->url_im($this->code, $adds, $vars).'">'.$pagenum.'</a> &nbsp;';
        }
        // возвращаем результат
        return $result;
    }
    
    /** Получить номер страницы по номеру текущей записи, и количеству записей на странице
     * 
     * @return int номер страницы
     */
    private function get_current_page()
    {
        // вычислим общее количество страниц
        $totalpages = $this->get_total_pages($this->count);
        // определим номер страницы, с которой начинать просмотр
        $pagenum = ceil($this->limitfrom / $this->limitnum);
        if ( $pagenum > $totalpages )
        {// если указано значение больше, чем последняя страница -
            // все равно вернем последнюю страницу
            $pagenum = $totalpages;
        }
        if ( $pagenum < 1 )
        {// отрицательное или нулевое значение страницы недопустимо
            $pagenum = 1;
        }
        return $pagenum;
    }
    
    /** Возвращает общее количество страниц для отображения
     * @return int количество страниц
     */
    private function get_total_pages()
    {
        return ceil($this->count / $this->limitnum);
    }
    
    /** Возвращает исходный параметр номера записи, с которого начинается просмотр
     * @return int
     */
    public function get_current_limitfrom()
    {
        return $this->limitfrom;
    }
        
    /** Возвращает исходный параметр минимального кол-ва записей на странице
     * @return int
     */
    public function get_current_limitnum()
    {
        return $this->limitnum;
    }
}
?>